/*
 * Poligono.cpp
 *
 *  Created on: 04/10/2009
 *      Author: ale
 */

#include "Poligono.h"
#include "Linea.h"
#include "Scanline.h"
#include "Clipper.h"

Poligono::Poligono(){

}

Poligono::Poligono(std::vector<Punto> &puntos){

    for(unsigned i=0 ; i< puntos.size();i++){
    	this->pts.push_back(puntos[i]);
    }

}
Poligono::~Poligono(){	}

void Poligono::setPuntos(std::vector<Punto> &puntos){
	 for(unsigned i=0 ; i< puntos.size();i++){
	    	this->pts.push_back(puntos[i]);
	    }
}
std::vector<Punto> Poligono::getPuntos() const{
	 return pts;
}

void Poligono::dibujarContorno(Matriz3D& mat){
	Linea* linea;
	Clipper clipper;
	std::vector<Punto> puntosO = transformarPuntos(mat);
	std::vector<Punto> puntosRec= clipper.clip(puntosO);
	for(int  i=0 ; i< ((int)puntosRec.size())-1;i++){
		linea =  new Linea(puntosRec[i],puntosRec[i+1]);
		linea->setColorLinea(this->colorLinea);
		linea->dibujarContorno(mat);
		delete linea;
	}
}
void Poligono::pintar(Matriz3D& mat){
	Scanline pintor;
	std::vector<Punto> puntosO = transformarPuntos(mat);
	Clipper clipper;
	std::vector<Punto> puntosRec= clipper.clip(puntosO);
	glColor3f(colorPintura.r(),colorPintura.g(),colorPintura.b());
	if(puntosRec.size()>1) pintor.rellenar(puntosRec);
}

void Poligono::transformar(Matriz3D& mat){
	for(unsigned i=0 ; i< pts.size();i++){
			pts[i] = (mat*pts[i]);
		 }
}

std::vector<Punto> Poligono::transformarPuntos(Matriz3D& mat){
	std::vector<Punto> puntos;
	for(unsigned i=0 ; i< pts.size();i++){
		puntos.push_back(mat*pts[i]);
	 }
	return puntos;
}


void Poligono::imprimirPuntos(std::vector<Punto>& p){
	for (unsigned i = 0; i < p.size(); ++i) {
		std::cout<<p[i]<<" , ";
	}
	std::cout<<std::endl;
}
